import { z } from 'zod';

// 创建角色的验证 schema
export const createRoleSchema = z.object({
  roleName: z.string().min(2, '角色名称至少需要2个字符').max(30, '角色名称最多30个字符'),
  roleKey: z.string().min(2, '角色权限字符串至少需要2个字符').max(100, '角色权限字符串最多100个字符'),
  roleSort: z.number().int().default(0),
  dataScope: z.enum(['1', '2']).default('1'), // 1-全部数据权限 2-自定数据权限
  menuCheckStrictly: z.enum(['0', '1']).default('1'),
  deptCheckStrictly: z.enum(['0', '1']).default('1'),
  status: z.enum(['0', '1']).default('0'), // 0-正常, 1-停用
  remark: z.string().max(500, '备注最多500个字符').optional(),
  menuIds: z.array(z.number().int()).optional(), // 菜单ID数组
  deptIds: z.array(z.number().int()).optional(), // 部门ID数组
});

// 更新角色的验证 schema
export const updateRoleSchema = z.object({
  roleName: z.string().min(2, '角色名称至少需要2个字符').max(30, '角色名称最多30个字符').optional(),
  roleKey: z.string().min(2, '角色权限字符串至少需要2个字符').max(100, '角色权限字符串最多100个字符').optional(),
  roleSort: z.number().int().optional(),
  dataScope: z.enum(['1', '2']).optional(),
  menuCheckStrictly: z.enum(['0', '1']).optional(),
  deptCheckStrictly: z.enum(['0', '1']).optional(),
  status: z.enum(['0', '1']).optional(),
  updateBy: z.string().max(64, '更新者最多64个字符').optional(),
  remark: z.string().max(500, '备注最多500个字符').optional(),
  menuIds: z.array(z.number().int()).optional(), // 菜单ID数组
  deptIds: z.array(z.number().int()).optional(), // 部门ID数组
}).refine(data => Object.keys(data).length > 0, {
  message: '至少需要提供一个字段进行更新',
});

// 角色授权菜单的验证 schema
export const roleMenuAuthSchema = z.object({
  roleId: z.number().int().positive('角色ID必须是正整数'),
  menuIds: z.array(z.number().int()),
});

// 角色授权部门的验证 schema
export const roleDeptAuthSchema = z.object({
  roleId: z.number().int().positive('角色ID必须是正整数'),
  deptIds: z.array(z.number().int()),
});

// 参数验证 schema
export const paramSchema = z.object({
  id: z.string().refine((val) => !isNaN(Number(val)), {
    message: 'ID 必须是数字',
  }),
});

// 查询角色参数 schema
export const queryRoleSchema = z.object({
  roleName: z.string().optional(), // 角色名称模糊查询
  roleKey: z.string().optional(), // 角色权限字符串模糊查询
  status: z.enum(['0', '1']).optional(), // 状态筛选
  pageNum: z.string().transform(Number).pipe(z.number().int().min(1)).optional().default('1'),
  pageSize: z.string().transform(Number).pipe(z.number().int().min(1).max(100)).optional().default('10'),
});

// 导出类型
export type CreateRoleDto = z.infer<typeof createRoleSchema>;
export type UpdateRoleDto = z.infer<typeof updateRoleSchema>;
export type RoleMenuAuthDto = z.infer<typeof roleMenuAuthSchema>;
export type RoleDeptAuthDto = z.infer<typeof roleDeptAuthSchema>;
export type ParamDto = z.infer<typeof paramSchema>;
export type QueryRoleDto = z.infer<typeof queryRoleSchema>;